package com.test.tong.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//代理对象
public class SayHelloProxy implements InvocationHandler {
    private Object target = null;

    public SayHelloProxy(Object target) {
        this.target = target;
    }

    public static Object bind(Object target) {
        SayHelloProxy selfHandlerProxy = new SayHelloProxy(target);
        /*
         * 实例化一个代理类，然后利用该代理对象执行器代理的对象的invoke方法。三个参数分别为：
         * 类加载器，
         * 目标对象的接口，将代理对象挂载到那个接口下
         * 实现代理类(使用此代理类中的invoke方法作为实际方法)
         */
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                selfHandlerProxy
        );
    }

    //代理对象的具体方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("只是因为在人群中看了你一眼");
        //具体实现，反射目标对象的方法中
        Object obj = method.invoke(this.target, args);
        System.out.println("风吹麦浪去~");
        return obj;
    }
}
